//
// Created by l on 2021/11/7.
//
#ifndef UAV_RMAP_H
#define UAV_RMAP_H

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include<string>

#include<iostream>

#include"Point.h"
#include"mainwindow.h"

using namespace std;

typedef signed char int8_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;


class RMap {
public:

    enum RMapItemType {
        RMAP_FREE = 0,                    // 空白区域 白色
        RMAP_OBSTACLE_UNDESCOVERED = 1,        // 未被发现的障碍物 深灰色
        RMAP_OBSTACLE_DILATE = 2,        // 膨胀的障碍物 浅灰色
        RMAP_OBSTACLE,                    // 障碍物
        RMAP_OBSTACLE_SCANNED,            // 已被扫描到的障碍物 黑色
        RMAP_START_POINT,                // 起点
        RMAP_END_POINT,                    // 终点
        RMAP_CURRENT_POSITION,            // 当前点
        RMAP_OBSTACLE_EDGE                // 障碍物扩展的点
    };

    uint32_t flag{};//(文件标识，内容是：0x15432345)

    int32_t m_line{};//（map的行数，像素数）
    int32_t m_col{};//（map的列数-my，像素数）
    int8_t **m_map{};
    int32_t m_startX{};//（起点的X坐标，startX）
    int32_t m_startY{};//（起点的Y坐标，startY）
    int32_t m_endX{};//（终点的X坐标，endX）
    int32_t m_endY{};//（终点的Y坐标，endY）
    //坐标系如图
    // O---------------> Y m_col
    // |
    // |
    // |
    // |
    // |
    // |
    // v X m_line
    //


public:

    int load(const string &);

    void pointMap(const vector<point> &, MainWindow *) const;

    int loadBmp(const string &filename);
};

void RMap::pointMap(const vector<point> &res, MainWindow *mainWin) const {
    for (auto &p: res) {
        m_map[p.getx()][p.gety()] = RMAP_OBSTACLE_SCANNED;
        mainWin->drawPoint(p.getx(), p.gety(), Qt::black);
//        for (auto &i: next_pos) {
//            int next_x = p.getx() + i[0];
//            int next_y = p.gety() + i[1];
//            if (!(next_x < m_line && next_x >= 0)) {
//                continue;
//            }
//            if (!(next_y < m_col && next_y >= 0)) {
//                continue;
//            }
//            if (next_x == p.getx() && next_y == p.gety()) {
//                continue;
//            }
//
//            m_map[next_x][next_y] = RMAP_OBSTACLE_DILATE;
//            mainWin->drawPoint(next_x, next_y, Qt::lightGray);
//        }

    }

}

int RMap::loadBmp(const string &filename) {
//    cv::Mat img = cv::imread(filename);
//    m_line = img.rows;
//    m_col = img.cols;
//    for (int i = 0; i < m_line; i++) {
//        for (int j = 0; j < m_col; j++) {
//
//        }
//    }
    //opencv
}


int RMap::load(const string &filename) {

    freopen(filename.c_str(), "r", stdin);

    string flag_head;
    cin >> flag_head;
    if (flag_head != "0x15432345") {
        cout << "ERR: input file format is not correct!\n" << endl;
        return -1;
    }

    string m_line_str;
    cin >> m_line_str;
    m_line = stoi(m_line_str);

    string m_col_str;
    cin >> m_col_str;
    m_col = stoi(m_col_str);


    m_map = reinterpret_cast<int8_t **>(new int *[m_line]);
    for (int i = 0; i < m_line; i++) {
        m_map[i] = reinterpret_cast<int8_t *>(new int[m_col]);
    }

    auto *strs = new string[m_line];

    for (int i = 0; i < m_line; i++) {
        cin >> strs[i];
    }

    for (int i = 0; i < m_line; i++) {
        for (int j = 0; j < m_col; j++) {
            m_map[i][j] = int8_t(strs[i][j] - '0');
        }
    }

    string m_startX_str;
    cin >> m_startX_str;
    m_startX = stoi(m_startX_str);

    string m_startY_str;
    cin >> m_startY_str;
    m_startY = stoi(m_startY_str);

    string m_endX_str;
    cin >> m_endX_str;
    m_endX = stoi(m_endX_str);

    string m_endY_str;
    cin >> m_endY_str;
    m_endY = stoi(m_endY_str);


    return 0;
}


#endif //UAV_RMAP_H
